-- *****************************************************************************
-- *                                                    *     _       _        *
-- *  AdaDecoupe                                        *    / \   __| | __ _  *
-- *  http://code.google.com/p/adadecoupe/              *   / _ \ / _` |/ _` | *
-- *  Radim Badsi & Célia Biguzzi - IG3                 *  / ___ \ (_| | (_| | *
-- *  Polytech'Montpellier                              * /_/   \_\__,_|\__,_| *
-- *                                                    *                      *
-- *****************************************************************************
-- *                                                                           *
-- * liste_commandes.adb  -  Liste_Commandes                                   *
-- * Liste de commandes.                                                       *
-- *                                                                           *
-- *****************************************************************************

package body Liste_Plaques_Finales is

    procedure Initialiser (L_Plaques_Finales : out T_Liste; L_Plaques : in Liste_Plaques.T_Liste) is
    
        procedure Copier (P : in Plaques.Plaque) is
        begin
            Liste.Ajout_Fin(L_Plaques_Finales, Creer(Plaques.Get_Id(P), Plaques.Get_Taille(P), Categories.Get_Categorie_Verre(Plaques.Get_Categorie(P))));
        end Copier;
        
        procedure Copier_Tout is new Liste_Plaques.Liste.Foreach(Copier);
	    
	begin
        Vider(L_Plaques_Finales);
        Copier_Tout(L_Plaques);
    end Initialiser;
	
    procedure Generer (
        L_Plaques_Finales : out T_Liste;
        Stock : in Liste_Plaques.T_Liste;
        L_Commandes : in Liste_Commandes.T_Liste) is
        
        procedure Traiter_Commande (Comm : in Commandes.Commande) is
            L_Plaque_Entiere : T_Liste;
            Plaque_Entiere : Plaque_Finale;
            Pi : Pieces.Piece;
        begin
            if Commandes.Get_Etat(Comm) = 'S' then
                Pi := Commandes.Get_Piece_Assoc(Comm);
        
                L_Plaque_Entiere := Cherche(L_Plaques_Finales, Emplacements.Get_Id_Plaque(Pieces.Get_Emplacement(Pi)));
                Plaque_Entiere := Liste.GetCourant(L_Plaque_Entiere);
                Ajouter_Contenu(Plaque_Entiere, Pi);
                Ajouter_Surface(Plaque_Entiere, Pieces.Surface(Pi));
                Liste.SetCourant(L_Plaque_Entiere, Plaque_Entiere);
            end if;
        end Traiter_Commande;
        
        procedure Traiter_Tous is new Liste_Commandes.Liste.Foreach(Traiter_Commande);
    begin
        Initialiser(L_Plaques_Finales, Stock);
        Traiter_Tous(L_Commandes);
    end Generer;

	function Cherche (L : T_Liste; Id : Natural) return T_Liste is
	
		-- Instancier la fonction de rappel avec le bon Id de plaque
		function Trouver_Id is new Plaques_Finales.Egal_Id(Id);
		function Cherche_Plaques_Finales is new Liste.Cherche(Trouver_Id);
	begin
		return Cherche_Plaques_Finales(L);
	end Cherche;
	
end Liste_Plaques_Finales;